Add options to conditionally suppress event creation

Akinori MUSHA 9 years ago
parent
commit
55b5ec9a87
2 changed files with 54 additions and 4 deletions
  1. 24 4
      app/models/agents/shell_command_agent.rb
  2. 30 0
      spec/models/agents/shell_command_agent_spec.rb

+ 24 - 4
app/models/agents/shell_command_agent.rb

@@ -20,6 +20,10 @@ module Agents
20 20
 
21 21
       The resulting event will contain the `command` which was executed, the `path` it was executed under, the `exit_status` of the command, the `errors`, and the actual `output`. ShellCommandAgent will not log an error if the result implies that something went wrong.
22 22
 
23
+      If `suppress_on_failure` is set to true, no event is emitted when `exit_status` is not zero.
24
+
25
+      If `suppress_on_empty_output` is set to true, no event is emitted when `output` is empty.
26
+
23 27
       *Warning*: This type of Agent runs arbitrary commands on your system, #{Agents::ShellCommandAgent.should_run? ? "but is **currently enabled**" : "and is **currently disabled**"}.
24 28
       Only enable this Agent if you trust everyone using your Huginn installation.
25 29
       You can enable this Agent in your .env file by setting `ENABLE_INSECURE_AGENTS` to `true`.
@@ -31,7 +35,7 @@ module Agents
31 35
         {
32 36
           "command": "pwd",
33 37
           "path": "/home/Huginn",
34
-          "exit_status": "0",
38
+          "exit_status": 0,
35 39
           "errors": "",
36 40
           "output": "/home/Huginn"
37 41
         }
@@ -41,6 +45,8 @@ module Agents
41 45
       {
42 46
           'path' => "/",
43 47
           'command' => "pwd",
48
+          'suppress_on_failure' => false,
49
+          'suppress_on_empty_output' => false,
44 50
           'expected_update_period_in_days' => 1
45 51
       }
46 52
     end
@@ -89,10 +95,19 @@ module Agents
89 95
 
90 96
         result, errors, exit_status = run_command(path, command, stdin)
91 97
 
92
-        vals = {"command" => command, "path" => path, "exit_status" => exit_status, "errors" => errors, "output" => result}
93
-        created_event = create_event :payload => vals
98
+        payload = {
99
+          'command' => command,
100
+          'path' => path,
101
+          'exit_status' => exit_status,
102
+          'errors' => errors,
103
+          'output' => result,
104
+        }
94 105
 
95
-        log("Ran '#{command}' under '#{path}'", :outbound_event => created_event, :inbound_event => event)
106
+        unless suppress_event?(payload)
107
+          created_event = create_event payload: payload
108
+        end
109
+
110
+        log("Ran '#{command}' under '#{path}'", outbound_event: created_event, inbound_event: event)
96 111
       else
97 112
         log("Unable to run because insecure agents are not enabled.  Edit ENABLE_INSECURE_AGENTS in the Huginn .env configuration.")
98 113
       end
@@ -128,5 +143,10 @@ module Agents
128 143
 
129 144
       [result, errors, exit_status]
130 145
     end
146
+
147
+    def suppress_event?(payload)
148
+      (boolify(interpolated['suppress_on_failure']) && payload['exit_status'].nonzero?) ||
149
+        (boolify(interpolated['suppress_on_empty_output']) && payload['output'].empty?)
150
+    end
131 151
   end
132 152
 end

+ 30 - 0
spec/models/agents/shell_command_agent_spec.rb

@@ -74,6 +74,8 @@ describe Agents::ShellCommandAgent do
74 74
   describe "#check" do
75 75
     before do
76 76
       stub(@checker).run_command(@valid_path, 'pwd', nil) { ["fake pwd output", "", 0] }
77
+      stub(@checker).run_command(@valid_path, 'empty_output', nil) { ["", "", 0] }
78
+      stub(@checker).run_command(@valid_path, 'failure', nil) { ["failed", "error message", 1] }
77 79
     end
78 80
 
79 81
     it "should create an event when checking" do
@@ -91,6 +93,34 @@ describe Agents::ShellCommandAgent do
91 93
       expect(Event.last.payload[:errors]).to eq('warning!')
92 94
     end
93 95
 
96
+    describe "with suppress_on_empty_output" do
97
+      it "should suppress events on empty output" do
98
+        @checker.options[:suppress_on_empty_output] = true
99
+        @checker.options[:command] = 'empty_output'
100
+        expect { @checker.check }.not_to change { Event.count }
101
+      end
102
+
103
+      it "should not suppress events on non-empty output" do
104
+        @checker.options[:suppress_on_empty_output] = true
105
+        @checker.options[:command] = 'failure'
106
+        expect { @checker.check }.to change { Event.count }.by(1)
107
+      end
108
+    end
109
+
110
+    describe "with suppress_on_failure" do
111
+      it "should suppress events on failure" do
112
+        @checker.options[:suppress_on_failure] = true
113
+        @checker.options[:command] = 'failure'
114
+        expect { @checker.check }.not_to change { Event.count }
115
+      end
116
+
117
+      it "should not suppress events on success" do
118
+        @checker.options[:suppress_on_failure] = true
119
+        @checker.options[:command] = 'empty_output'
120
+        expect { @checker.check }.to change { Event.count }.by(1)
121
+      end
122
+    end
123
+
94 124
     it "does not run when should_run? is false" do
95 125
       stub(Agents::ShellCommandAgent).should_run? { false }
96 126
       expect { @checker.check }.not_to change { Event.count }